frontend/pages/api/nauth/[...nextauth].js (view raw)
1import NextAuth from 'next-auth';
2import CredentialsProvider from 'next-auth/providers/credentials';
3import GoogleProvider from 'next-auth/providers/google';
4
5const {STRAPI_URL = 'http://localhost:1337'} = process.env;
6
7const authHandler = NextAuth({
8 providers: [
9 CredentialsProvider({
10 name: 'magic-link',
11 credentials: {
12 token: {label: 'Token', type: 'password'},
13 },
14 async authorize(credentials) {
15 console.log({credentials});
16 const response = await fetch(`${STRAPI_URL}/api/auth/magic-link`, {
17 method: 'POST',
18 headers: {'Content-Type': 'application/json'},
19 body: JSON.stringify({
20 token: credentials.token,
21 }),
22 });
23 const data = await response.json();
24 if (!data?.jwt) return null;
25 else {
26 const {user, jwt} = data;
27 return {...user, jwt};
28 }
29 },
30 }),
31 GoogleProvider({
32 clientId: process.env.GOOGLE_CLIENT_ID,
33 clientSecret: process.env.GOOGLE_CLIENT_SECRET,
34 }),
35 ],
36 session: {
37 jwt: true,
38 },
39 callbacks: {
40 jwt: async params => {
41 const {token, user, account} = params;
42
43 // Google Auth
44 if (account?.provider === 'google') {
45 const response = await fetch(
46 `${STRAPI_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`
47 );
48 const data = await response.json();
49
50 if (data.error) {
51 console.error(
52 `Error from Strapi on authentication with Google: `,
53 data.error
54 );
55 throw new Error(data.error?.message || data.error);
56 }
57
58 token.id = data.user.id;
59 token.jwt = data.jwt;
60 token.email = data.user.email;
61 token.username = data.user.name;
62 token.lang = data.user.lang?.toLowerCase();
63 token.provider = account.provider;
64 }
65
66 // Strapi Auth
67 else if (user) {
68 token.id = user.id;
69 token.jwt = user.jwt;
70 token.email = user.email;
71 token.username = user.firstname;
72 token.lang = user.lang?.toLowerCase();
73 token.provider = account.provider;
74 }
75
76 return token;
77 },
78 session: async params => {
79 const {session, token} = params;
80 if (session) {
81 try {
82 const response = await fetch(`${STRAPI_URL}/api/users/me`, {
83 headers: {
84 'Content-Type': 'application/json',
85 Authorization: `Bearer ${token.jwt}`,
86 },
87 });
88 const profile = await response.json();
89 session.profile = profile;
90 } catch (error) {
91 console.error(error);
92 }
93
94 session.token = token;
95 session.user.name = token.username;
96 session.user.lang = token.lang;
97 }
98 return session;
99 },
100 },
101 pages: {
102 signIn: '/auth/login',
103 error: '/auth/login',
104 },
105});
106
107export default async function handler(...params) {
108 await authHandler(...params);
109}